"""
    x轴:国家信息列表
    y轴:国家GDP值
    取出对应的年份
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType

# 数据读取
file_name = 'D:\\其他学习\\python学习\\python黑马课堂资料\\资料\\第1-12章资料\\资料\\可视化案例数据\\动态柱状图数据\\1960-2019全球GDP数据.csv'
file_data = open(file_name, 'r', encoding='ANSI')
# 将数据读取，并转为列表
file_data = file_data.readlines()
# 去掉列表中第一个的数据
file_data.pop(0)
# 创建一个元组（tuple)
dict_data = {}
for file_data_year in file_data:
    all_file_data_year = file_data_year.split(',')
    # 获取年份
    year = all_file_data_year[0]
    # 获取国家
    country = all_file_data_year[1]
    # 获取GDP值，并转为亿元
    country_gdp = float(all_file_data_year[2].strip())/100000000
    # 将数据转为{1960:[['中国‘, 1111], ['美国', '222'], [], []...]}形式数据
    try:
        dict_data[year].append([country, country_gdp])
    except KeyError:
        """
            由于元组中，key对应的value为列表（list)，而在元组中获取key时，如果key为空，则会抛异常KeyError,所以使用try-except进行处理
            当元组中该key不存在时，则存储该key
        """
        dict_data[year] = []
        dict_data[year].append([country, country_gdp])

# 生成柱状图
# 使用sorted对元组中的所有key值进行顺序排序
keys = sorted(dict_data.keys())
timeLine = Timeline({'theme':ThemeType.LIGHT})

for year in keys:
    year_country_data = dict_data[year]
    # 将元组中key对应的value值，进行排序，sort(接受一个函数, reverse=True)倒序排序，取GDP的前八个数据
    year_country_data.sort(key=(lambda element : element[1]), reverse=True)
    year_country_data = year_country_data[0:8]
    country = []
    country_gdp = []
    for country_data in year_country_data:
        # 创建列表，获取国家信息，为X轴
        country.append(country_data[0])
        # 创建列表，获取GDP信息，为Y轴
        country_gdp.append(country_data[1])

    bar = Bar()
    # 构建柱状图的x轴
    # 由于country_gdp信息展示，从上往下为：从小到大，而需求为从大到小展示，所以需要进行反转，GDP反转，国家信息也需要反转
    country.reverse()
    country_gdp.reverse()

    bar.add_xaxis(country)
    bar.add_yaxis(series_name='GDP数值(亿)',
                  y_axis=country_gdp,
                  label_opts=LabelOpts(position='right'),
                  bar_width=30)

    # 将X轴和Y轴反转
    bar.reversal_axis()
    timeLine.add(bar, year)

timeLine.add_schema(
    play_interval=500,
    is_timeline_show=True,
    is_auto_play=True,
    is_loop_play=True
)
timeLine.render("历年GDP展示.html")

# sort的使用 reverse=False：顺序排序
def compare(element):
    return element[1]
list1 = [['age', 18], ['age', 20], ['age', 15]]
list1.sort(key=compare, reverse=False)
print(list1)

# 简化为使用lambda reverse=True：倒序排序
list1.sort(key=(lambda element:element[1]), reverse=True)
print(list1)

